package org.example;

import com.opencsv.exceptions.CsvValidationException;
import org.example.analyzer.DataAnalyzer;
import org.example.hbase.HBaseUtil;
import org.example.importer.DataImporter;
import org.example.web.WebServer;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import java.io.IOException;

public class Main {
    private static final Logger LOGGER = LoggerFactory.getLogger(Main.class);
    private static final int HTTP_PORT = 8080;
    private static final int WEBSOCKET_PORT = 8081;

    public static void main(String[] args) {
        // 添加一个关闭钩子，确保程序退出时能关闭HBase连接
        Runtime.getRuntime().addShutdownHook(new Thread(() -> {
            LOGGER.info("应用程序正在关闭...");
            try {
                HBaseUtil.close();
            } catch (IOException e) {
                LOGGER.error("关闭HBase连接时发生错误。", e);
            }
        }));

        LOGGER.info("应用程序启动。");

        try {
            // 在启动服务器之前，先执行一次初始的数据加载和分析
            LOGGER.info("===== 正在执行初始数据加载与分析... =====");
            HBaseUtil.recreateTable();
            DataImporter dataImporter = new DataImporter();
            dataImporter.importData("database.csv");
            DataAnalyzer dataAnalyzer = new DataAnalyzer();
            String initialJsonData = dataAnalyzer.analyze();
            LOGGER.info("===== 初始数据处理完成。 =====");

            // 启动Web服务器，并传入初始的JSON数据
            WebServer webServer = new WebServer(HTTP_PORT, WEBSOCKET_PORT, initialJsonData);
            webServer.start();

        } catch (IOException | CsvValidationException e) {
            LOGGER.error("应用程序执行期间发生严重错误！程序将退出。", e);
        }
    }
}